#include <stdio.h>
#include <string.h>
#include <stdlib.h>

//高精度套餐:
//每个高精度函数输入两个字符串,输出对应的运算结果,支持各种正负情况

int num[201];
char a[11005];
char b[11005];
char c[11005];//用来保存临时字符串
char d[11005];

int max(int x,int y)
{
    return x>y?x:y;
}

int min(int x,int y)
{
    return x>y?y:x;
}

int cmp(char *a,char *b)
{
	int m=strlen(a),n=strlen(b);
    if(m>n) return 1;
    if(n>m) return -1;
	int limit=min(m,n);
	for(int i=0;i<limit;i++) 
	{
		if(a[i]<b[i]) return -1;
		if(a[i]>b[i]) return 1;
	}
	return (n==limit)-(m==limit);
}

char *del(char *x,char *y);

char *add(char *x,char *y)//传入两个正置的字符串数组,返回一个倒置的字符串数组
{
    if((x[0]=='-') && (y[0]=='-'))
    {
        char *t=add(x+1,y+1);
        char *q=(char *)malloc((strlen(t)+5)*sizeof(char));
        memset(q,0,strlen(t)+5);
        q[0]='-';
        for(int i=1;i<=strlen(t);i++) q[i]=t[i-1];
        free(t);
        return q;
    }
    if(x[0]=='-')
    {
        char *t=(char *)malloc((strlen(x)+2)*sizeof(char));
        memset(t,0,strlen(x)+2);
        for(int i=1;i<strlen(x);i++) t[i-1]=x[i];
        return del(y,t);
    }
    if(y[0]=='-') return add(y,x);
    int m=strlen(x);
    int n=strlen(y);
    char *s=(char *)malloc((max(m,n)+5)*sizeof(char));
    char *r=(char *)malloc((max(m,n)+5)*sizeof(char));
    char *p=(char *)malloc((m+2)*sizeof(char));
    char *q=(char *)malloc((n+2)*sizeof(char));
    memset(s,0,max(m,n)+5);
    memset(r,0,max(m,n)+5);
    memset(p,0,m+2);
    memset(q,0,n+2);
    for(int i=0;i<m;i++) p[i]=x[m-i-1];
    for(int i=0;i<n;i++) q[i]=y[n-i-1];

    for(int i=0;i<=min(m,n)-1;i++) s[i]=p[i]-'0'+q[i];
    if(m>n)
    for(int i=min(m,n);i<m;i++) s[i]=p[i];
    else for(int i=min(m,n);i<n;i++) s[i]=q[i];

    int t=strlen(s);
    for(int i=0;i<t;i++) 
    if(s[i]>'9') 
    {
        s[i]-=10;
        if(s[i+1]==0) s[i+1]='0';
        s[i+1]++;
    }
    t=strlen(s);
    for(int i=0;i<t;i++) r[i]=s[t-i-1];
    free(s);free(p);free(q);
    return r;
}

char *del(char *x,char *y)//在计算时,x大于y
{
    if((x[0]=='-') && (y[0]=='-'))
    {
        char *t=(char *)malloc((strlen(y)+5)*sizeof(char));
        for(int i=1;i<strlen(y);i++) t[i-1]=y[i];
        return add(x,t);
    }
    if(x[0]=='-')
    {
        char *t=(char *)malloc(strlen(x)*sizeof(char));
        memset(t,0,strlen(x));
        for(int i=1;i<strlen(x);i++) t[i-1]=x[i];
        char *s=add(t,y);
        char *m=(char *)malloc((strlen(s)+5)*sizeof(char));
        memset(m,0,strlen(s)+5);
        m[0]='-';
        for(int i=1;i<=strlen(s);i++) m[i]=s[i-1];
        return m;
    }
    if(y[0]=='-')
    {
        char *t=(char *)malloc(strlen(y)*sizeof(char));
        memset(t,0,strlen(y));
        for(int i=1;i<strlen(y);i++) t[i-1]=y[i];
        return add(x,t);
    }
    if(cmp(x,y)==-1) 
    {
        char *t=del(y,x);
        char *s=(char *)malloc((strlen(t)+5)*sizeof(char));
        memset(s,0,strlen(t)+5);s[0]='-';
        for(int i=1;i<=strlen(t);i++) s[i]=t[i-1];
        return s;
    }
    int m=strlen(x);
    int n=strlen(y);
    int *s=(int *)malloc((m+5)*sizeof(int));
    char *r=(char *)malloc((m+5)*sizeof(char));
    int *p=(int *)malloc((m+2)*sizeof(int));
    int *q=(int *)malloc((m+2)*sizeof(int));
    memset(s,0,m+5);
    memset(r,0,m+5);
    memset(p,0,m+2);
    memset(q,0,m+2);
    for(int i=0;i<m;i++) p[i]=x[m-i-1]-'0';
    for(int i=0;i<n;i++) q[i]=y[n-i-1]-'0';//得到两个倒置的int数组
    q[n]=0;
    for(int i=0;i<m;i++) s[i]=p[i]-q[i];

    for(int i=0;i<m;i++)
    if(s[i]<0) s[i]+=10,s[i+1]--;
    int j=m;
    while((s[j]==0) && (j>=0)) j--;//去掉无效位
    if(j<0)
    {
        char *s=(char *)malloc(3*sizeof(char));
        s[0]='0';s[1]=s[2]=0;
        return s;
    }
    for(int i=0;i<=j;i++) r[i]=s[j-i]+'0';
    free(s);free(p);free(q);
    return r;
} 

char *mul(char *x,char *y)
{
	int m=strlen(x);
	int n=strlen(y);
	int *z=(int *)malloc((m+n+100)*sizeof(int));
	int *p=(int *)malloc((m+5)*sizeof(int));
	int *q=(int *)malloc((n+5)*sizeof(int)); 
	for(int i=0;i<m+n+100;i++) z[i]=-1;//初始化
	for(int i=0;i<m;i++) p[i]=0;
	for(int i=0;i<n;i++) q[i]=0;
	for(int i=0;i<m;i++) p[i]=x[m-i-1]-'0';
	for(int i=0;i<n;i++) q[i]=y[n-i-1]-'0';
	for(int i=0;i<n;i++)
	for(int j=0;j<m;j++)
    {
        if(z[i+j]==-1) z[i+j]=0;
	    z[j+i]+=p[j]*q[i];
    }
	for(int i=0;i<m+n+100;i++)
	{
		if(z[i]>=10) 
		{
            if(z[i+1]==-1) z[i+1]=0;
			z[i+1]+=z[i]/10;
			z[i]=z[i]%10;
		}
	}
    int j=m+n+99;
    while(z[j]==-1) j--;
    j++;
	char *o=(char *)malloc((j+5)*sizeof(char));
    memset(o,0,j+5);
	for(int i=0;i<j;i++) o[i]=z[j-i-1]+'0';
    int k=-1;while(o[++k]=='0');
    if(o[k]==0) 
    {
        char *s=(char*)malloc(sizeof(char)*3);
        s[0]='0';s[1]=s[2]=0;
        return s;
    }
	return o+k;
} 

int main()
{
    int n;
    scanf("%d",&n);
    int i=-1,j=2;
    while(n>=j)
    {
        n-=j;
        num[++i]=j;
        j++;
    }
    
   
    int t=i;
    while((n!=0) && (t>=0))
    {
        num[t--]++;
        n--;
    }
    if((t<0) && (n!=0)) num[i]++;
	for(int s=0;s<=i;s++) printf("%d ",num[s]); printf("\n");
    char *tem=(char*)malloc(3*sizeof(char));
    tem[0]='1';tem[1]=tem[2]=0;//初始化
    for(int s=0;s<=i;s++)
    {
        int p=-1;
        int q=num[s];
        while(q!=0)
        {
            c[++p]=q%10+'0';
            q/=10;
        }
        p++;//表示长度
        for(int k=0;k<p;k++) d[k]=c[p-k-1];
		tem=mul(tem,d);
	    memset(c,0,p+2);
        memset(d,0,p+2);
    }
    printf("%s\n",tem);
}